#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

struct absInt
{
    // 函数调用运算符
    int operator()(int val) const {
        return val < 0 ? -val : val;
    }
};

class PrintString {
    public:
        PrintString(ostream& o = cout, char c = ' '):
            os(o), sep(c) {}
        void operator()(const string& s) const { os << s << sep; }
    private:
        ostream& os;            // 用于写入的目的流
        char sep;               // 用于将不同输出隔开的字符
};

int main()
{
    int i = -42;
    absInt absObj;              // 含有函数调用运算符的对象
    int ui = absObj(i);         // 将 i 传递给 abdObj.operator()
    cout << ui << endl;
    cout << endl;

    string s = "hi";
    PrintString printer;        // 使用默认值，打印到 cout
    printer(s);                 // 在 cout 中打印 s，后面跟一个空格
    PrintString errors(cerr, '\n');
    errors(s);                  // 在 cerr 中打印 s，后面跟一个换行符

    vector<string> vs{"hello", "world"};
    for_each(vs.begin(), vs.end(), PrintString(cerr, '\n'));
    cout << endl;
}